// Person.h
#include <iostream>
#include <string>
using namespace std;

/**
 * 继承中属性
 * 当不写继承方式时，编译器默认为私有属性
 * 公有继承：
 * 1. 公有属性成员仍然是公有属性
 * 2. 保护属性成员仍然是保护属性
 * 3. 私有属性成员仍然是私有属性，派生类不能访问基类中私有成员
 * 
 * 保护继承：
 * 1. 公有属性成员变成了保护属性
 * 2. 保护属性成员仍然是保护属性
 * 3. 私有属性成员仍然是私有属性
 * 
 * 私有继承：
 * 1. 公有属性成员变成了私有属性
 * 2. 保护属性成员变成了私有属性
 * 3. 私有属性成员仍然是私有属性
*/

class Person
{
public:
    Person() {}
    ~Person() {}
    void setName(const string &name) {}
    string getName() const {}
    void setAge(int age) {}
    int getAge() const {}
protected:
    string name;
private:
    int age;
};

class Student : Person
{
public:
    Student() {
        // 派生类不能访问基类中私有成员
        // age = 17;

        name = "xxx";
        setName("xxx");
    }
    ~Student() {}
    void setId(int id) {}
    int getId() const {}
private:
    int id;
};

class HighStudent : public Student
{
public:
    HighStudent() {
        // 验证了私有继承后公有属性和保护属性变成了私有属性
        setName("xxx");
        name = "xxx";
    }
    ~HighStudent() {}
};

int main()
{
    Student stu;
    // stu.setName("name");
    // 对象不能访问保护成员和私有成员
    // stu.name = "xxx";
    // stu.age = 17;
    return 0;
}